package com.JUC.cha03.sec05;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * future 常用方法
 * 1. 获取结果和触发计算
 *
 *  1.1. get()  一直执行，直到结束，容易线程堵塞，需要抛出异常
 *  1.2. git()  给定超时时间，超过时间抛出异常，需要抛出异常
 *  1.3. gitNow()   判断当前是否已经获取结果，获取结果返回，没有获取返回给定的值，需要抛出异常
 *  1.4. join()     类似于get()，但是不需要异常抛出
 *  1.5. complete() 是否已经获取到结果，获取到返回，没有获取到则打断join/get，返回给定的值
 */
public class CompletableFutureAPIDemo {

    public static void main(String[] args) // throws ExecutionException, InterruptedException, TimeoutException
    {

        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            // 暂停几秒钟线程
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "abc";
        });

        // 暂停几秒钟线程
        try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }

//        System.out.println(completableFuture.get()); //死心眼一直执行，直到结束
//        System.out.println(completableFuture.get(2, TimeUnit.SECONDS)); //给你机会你得掌握，过期不候
//        System.out.println(completableFuture.join());// 无需抛异常，比get好一点
//        System.out.println(completableFuture.getNow("XXX")); // 如果现在出结果了，返回结果，没出结果就返回给的值
        System.out.println(completableFuture.complete("test") + "\t" + completableFuture.join());// 是否已经获取到结果，获取到返回，没有获取到则打断join/get，返回给定的值


    }
}
